home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d923.lha / MagicPubName / MagicPubName.mod < prev    next >
Text File  |  1993-10-07  |  8KB  |  238 lines

  1. (* ------------------------------------------------------------------------
  2.   :Program.       MagicPubName.mod
  3.   :Contents.      Brief, yet smart & versatile "Gimme that damn'
  4.   :Contents.      PubScreen's name"- utility.
  5.   :Author.        Franz Schwarz
  6.   :Copyright.     Freeware (freely distributable, copyrighted software)
  7.   :Language.      Oberon
  8.   :Translator.    Amiga Oberon 3.0
  9.   :History.       v1.0 fSchwarz 28-Mär-93 (first public release)
  10.   :History.       v1.1 fSchwarz  3-Jul-93 major internal changes, added
  11.   :History.         ConsoleScr option, changed name from GetPubName to
  12.   :History.         MagicPubName
  13.   :History.       v1.2 fSchwarz  19-Jul-93 added ToFront feature
  14.   :History.       v1.3 fSchwarz  27-Jul-93 added Quiet switch, now uses
  15.   :History.         BlackMagic
  16.   :History.       v1.3a fSchwarz  6-Aug-93 recompiled with BlackMagic1.8
  17.   :History.         (ConsoleScr=Con/S was broken)
  18.   :Support.       BlackMagic
  19.   :Address.       Mühlenstraße 2, D-78591 Durchhausen, Germany / R.F.A.
  20.   :Address.       uucp: Franz.Schwarz@mil.ka.sub.org; Fido: 2:241/7506.18
  21.   :Remark.        POSSIBLE ODD POINTERS TO ARRAY OF CHAR
  22.   :Remark.        DON'T COMPILE WITH OddChk!
  23.   :Remark.        Note the complexity of this utility - far beyond the
  24.   :Remark.        usual trivial GetPubNames. An ideal complement for
  25.   :Remark.        Bernhard Möllemann's great ScreenManager.
  26.   :Usage.         RequireVisible=RV/S,RequireFront=RF/S,Default/S,
  27.   :Usage.         Shanghai/S,ConsoleScr=Con/S,ScreenName=Scr,Case/S,
  28.   :Usage.         WBOnFailure=WBF/S,ToFront/S
  29. ------------------------------------------------------------------------ *)
  30.  
  31. (* $SET NODEBUG *)
  32.  
  33. MODULE MagicPubName;
  34.  
  35. IMPORT 
  36.   e: Exec, d: Dos, I: Intuition, g: Graphics, u: Utility, 
  37.   b: BlackMagic, o: OberonLib (* $IF DEBUG *) , NoGuru (* $END *) ;
  38.  
  39.  
  40. TYPE
  41.   ArgsT = STRUCT
  42.     requireVisible: LONGINT;
  43.     requireFront  : LONGINT;
  44.     default       : LONGINT;
  45.     shanghai      : LONGINT;
  46.     consoleScr    : LONGINT;
  47.     screenName    : e.STRPTR;
  48.     case          : LONGINT;
  49.     wbOnFailure   : LONGINT;
  50.     toFront       : LONGINT;
  51.     quiet         : LONGINT;
  52.   END;  
  53.  
  54.  
  55. CONST 
  56.   ignoreRV = 0;
  57.  
  58.   template = "RequireVisible=RV/S,RequireFront=RF/S,Default/S,Shanghai/S,ConsoleScr=Con/S,ScreenName=Scr,Case/S,WBOnFailure=WBF/S,ToFront/S,Quiet=Q/S";
  59.  
  60.   verStr = "\000$VER: MagicPubName 1.3a (6.8.93) © Franz.Schwarz@mil.ka.sub.org - Freeware";
  61.  
  62. VAR
  63.   Rda                     : d.RDArgsPtr;
  64.   Args                    : ArgsT;
  65.   ScrNam                  : ARRAY I.maxPubScreenName+1 OF CHAR;
  66.   FirstScr, DefPubScr, Scr: I.ScreenPtr;
  67.   ShanghaiScr, ConsoleScr : I.ScreenPtr;
  68.   ScrList                 : e.ListPtr;
  69.   l                       : LONGINT;
  70.   modes                   : SET;
  71.  
  72. (* Finds a specific Screen in the system public screen list *)  
  73. PROCEDURE SearchPubScr (Scr: I.ScreenPtr; Name: e.STRPTR): I.ScreenPtr;
  74. VAR 
  75.   nd1        : I.PubScreenNodePtr;
  76.   i, passes  : INTEGER;
  77.  
  78. BEGIN
  79.   IF (Scr = NIL) & (Name = NIL) THEN RETURN NIL; END;
  80.   IF (Name # NIL) & (Args.case = 0) THEN passes := 2; ELSE passes := 1; END;
  81.   FOR i:=1 TO passes DO
  82.     nd1 := ScrList.head;      
  83.     WHILE nd1.node.succ # NIL DO
  84.       IF ~(I.psnfPrivate IN nd1.flags) THEN
  85.         LOOP
  86.           IF Args.requireVisible # 0 THEN 
  87.             IF g.vpHide IN nd1.screen.viewPort.modes THEN EXIT; END;
  88.           END;
  89.           IF Scr # NIL THEN IF nd1.screen # Scr THEN EXIT; END; END;
  90.           IF Name # NIL THEN 
  91.             CASE i OF
  92.               1: IF nd1.node.name^ # Name^ THEN EXIT; END; |
  93.               2: IF u.Stricmp (nd1.node.name^, Name^) # 0 THEN EXIT; END;
  94.             END;  
  95.           END;  
  96.           COPY (nd1.node.name^, ScrNam);
  97.           RETURN nd1.screen;
  98.         END;  
  99.       END;  
  100.       nd1 := nd1.node.succ;
  101.     END;
  102.   END;  
  103.   RETURN NIL;
  104. END SearchPubScr;
  105.  
  106. BEGIN
  107.  
  108.   IF o.wbStarted OR (d.dos.lib.version < 37) THEN HALT (20); END;
  109.   Rda := d.ReadArgs (template, Args, NIL);
  110.  
  111.   IF Rda # NIL THEN
  112.     IF (Args.case # 0) & (Args.screenName = NIL) THEN
  113.       IF d.SetIoErr (d.tooManyArgs) = 0 THEN END;
  114.       d.FreeArgs (Rda); Rda := NIL;
  115.     END;  
  116.   END;  
  117.  
  118.   IF Rda # NIL THEN
  119.     IF (Args.requireVisible = 0) & (Args.default = 0) & 
  120.        (Args.shanghai = 0) & (Args.screenName = NIL) & 
  121.        (Args.consoleScr = 0) & (Args.requireFront = 0) THEN
  122.       Args.wbOnFailure := -1; (* due to compatability considerations *)
  123.     END;  
  124.   
  125.     DefPubScr := I.LockPubScreen (NIL); 
  126.     I.UnlockPubScreen (NIL, DefPubScr);
  127.     IF Args.shanghai # 0 THEN
  128.       e.Forbid ();    
  129.       modes := I.SetPubScreenModes ({});
  130.       IF I.SetPubScreenModes (modes) = {} THEN END;
  131.       e.Permit ();
  132.       IF ~(I.shanghai IN modes) THEN
  133.         ShanghaiScr := I.LockPubScreen ("Workbench");
  134.       ELSE  
  135.         ShanghaiScr := I.LockPubScreen (NIL);
  136.       END;      
  137.       I.UnlockPubScreen (NIL, ShanghaiScr);      
  138.     END;  
  139.     IF Args.consoleScr # 0 THEN ConsoleScr := b.GetTTYScreen (d.Input()); END;
  140.     IF Args.requireFront # 0 THEN FirstScr := I.int.firstScreen; END;
  141.     
  142.     Scr := NIL;
  143.     IF Args.default # 0 THEN
  144.       IF DefPubScr # NIL THEN
  145.         Scr := DefPubScr;
  146.       ELSE  
  147.         o.Result := 5;
  148.       END;  
  149.     END;  
  150.  
  151.     IF Args.shanghai # 0 THEN      
  152.       LOOP
  153.         IF ShanghaiScr # NIL THEN 
  154.           IF Scr = NIL THEN EXIT; END;
  155.           IF Scr = ShanghaiScr THEN EXIT; END;
  156.         END;  
  157.         o.Result := 5;
  158.         EXIT;  
  159.       END;
  160.       IF o.Result = 0 THEN Scr := ShanghaiScr; END;
  161.     END;  
  162.  
  163.     IF Args.consoleScr # 0 THEN      
  164.       LOOP
  165.         IF ConsoleScr # NIL THEN
  166.           IF Scr = NIL THEN EXIT; END;
  167.           IF Scr = ConsoleScr THEN EXIT; END;
  168.         END;  
  169.         o.Result := 5;
  170.         EXIT;  
  171.       END;  
  172.       IF o.Result = 0 THEN Scr := ConsoleScr; END;
  173.     END;  
  174.     
  175.     IF Args.requireFront # 0 THEN
  176.       LOOP
  177.         IF FirstScr # NIL THEN
  178.           IF Scr = NIL THEN EXIT; END;
  179.           IF Scr = FirstScr THEN EXIT; END;
  180.         END;  
  181.         o.Result := 5;
  182.         EXIT;  
  183.       END;  
  184.       IF o.Result = 0 THEN Scr := FirstScr; END;
  185.     END;  
  186.       
  187.     IF (Scr = NIL) & (Args.screenName = NIL) THEN
  188.       l := I.LockIBase (0);
  189.       Scr := I.int.firstScreen;
  190.       LOOP
  191.         IF Scr = NIL THEN EXIT; END;
  192.         IF ~(g.vpHide IN Scr.viewPort.modes) THEN
  193.           IF {I.publicScreen} = Scr.flags * I.screenType THEN EXIT; END;     
  194.           IF {I.wbenchScreen} = Scr.flags * I.screenType THEN EXIT; END;
  195.         END;  
  196.         Scr := Scr.nextScreen;
  197.       END;  
  198.       I.UnlockIBase (l);
  199.       IF Scr = NIL THEN Scr := DefPubScr; END;
  200.     END;  
  201.     ScrList := I.LockPubScreenList ();
  202.     IF ScrList # NIL THEN    
  203.       IF SearchPubScr (Scr, Args.screenName) = NIL THEN o.Result := 5; END;
  204.       IF ScrNam = "" THEN o.Result := 5; END;
  205.       IF o.Result # 0 THEN
  206.         ScrNam := ""; 
  207.         IF Args.wbOnFailure # 0 THEN
  208.           Args.requireVisible := 0;
  209.           IF SearchPubScr (DefPubScr, NIL) = NIL THEN END;
  210.         END;  
  211.       END;  
  212.       I.UnlockPubScreenList ();
  213.     END;      
  214.     IF ScrNam = "" THEN o.Result := 5; END;
  215.     IF o.Result # 0 THEN IF ScrNam = "" THEN 
  216.       IF Args.wbOnFailure # 0 THEN ScrNam := "Workbench"; END;
  217.     END; END;    
  218.     IF ScrNam # "" THEN 
  219.       IF Args.toFront # 0 THEN
  220.         Scr := I.LockPubScreen (ScrNam);      
  221.         IF Scr # NIL THEN 
  222.           I.ScreenToFront (Scr); I.UnlockPubScreen (NIL, Scr); 
  223.         ELSE  
  224.           o.Result := 5;
  225.         END;
  226.       END;  
  227.       IF Args.quiet = 0 THEN 
  228.         d.PrintF ("%s", b.StrIndex (ScrNam, 0)); d.Flush (d.Output());
  229.       END;  
  230.     END;
  231.     d.FreeArgs (Rda);
  232.   ELSE  
  233.     d.PrintF ("%s failed.\n", b.StrIndex (verStr, 7));
  234.     o.Result := 20;
  235.   END; (* IF Rda # NIL *)
  236. END MagicPubName.
  237.  
  238.